#ifndef __JSON_OPRERATE_
#define __JSON_OPRERATE_

//需要的头文件
#include <stdio.h>
#include <cJSON.h>
#include <string.h>
#include <shmem.h>
#include <MQTTClient.h>
#include <msg_queue_peer.h>
#include <sqlite3.h>
#include <pthread.h>
#include <time.h>
#include <log_utils.h>


//宏定义点表存放的位置
#define CONFIG_PATH "/mnt/config/dev_config.json"
#define CLIENTID "ExampleClientSub"

#define TOPIC_DATA_DOWN "/app/data/down"  //1,4类型指令
#define TOPIC_DATA_UP "/app/data/up"

#define TOPIC_CTL_DOWN "/app/control/down"  //2类型指令
#define TOPIC_CTL_UP "/app/control/up"

#define TOPIC_MODE_DOWN "/app/mode/down"    //3类型指令
#define TOPIC_MODE_UP "/app/mode/up"


#define QOS 1
#define TIMEOUT 10000L   
#define NUM 100
#define POINT_MAX 4096    //
//用于存放点表信息，mqtt服务器的地址和端口
struct pointMsg
{
    char addr[32];
    int port;
    int report_type;    //0-不上报，客户端主动采集；1-变化上报，即连续2次值不相等；2-周期上报
    int report_period;  //上报周期时间，单位秒，仅在type=2时有效
};


union val_t
{ 
    int b_val;  //bool类型存储空间
    int i_val;   //整形值存储空间
    float f_val;  //浮点值存储空间
};

struct std_node
{
	int key;  //唯一键值
	int type;  //数据点类型
    int dev_type;  //数据点属于哪个设备，根据网关支持的设备自行定义
	union val_t old_val;  //变化上报后需要更新旧值
    union val_t new_val;  //从共享内存取出最新数据，放到new_val中
    int ret;  //默认为-1，采集成功后设置为0，采集失败再置-1
};

//消息队列的结构体
struct msgbuf
{
    long mtype;
    char mdata[256];
};



//函数的声明
struct  pointMsg parsingPoint();  //解析电表获取mqtt服务器的地址和端口
MQTTClient connectToMqtt(struct pointMsg point); //链接到mqtt
void connlost(void *context, char *cause);
void delivered(void *context, MQTTClient_deliveryToken dt);
int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message);//mqtt接受到消息
void savePointToShame(char *buf); //解析点表共享内存部分
void sendCtr(); //控制不同的上报方式
void dataUp();  //处理要发送的数据
void mqttSend(char *str,char *topic); //通过mqtt发送
int ChangeMode(int type,int period); //改变模式
void historyUp(); //历史上传
void *SaveToSqlite(void *arg);  //保存到数据库线程传递的函数
int historyCallback(void *para, int f_num, char **f_value, char **f_name);
#endif